#include <iostream>
#include <gtest/gtest.h>
// 全局事件:针对整个测试程序,提供全局事件机制,能够在测试之前配置测试环境
// 数据,测试完毕后清理数据
// 先定义环境类,通过继承 testing::Environment 的派生类来完成
// 重写的虚函数接口 SetUp 会在测试之前被调用; TearDown 会在测试完毕后调
// 用.

// std::unordered_map<std::string, std::string> dict;
// class HashTestEnv : public testing::Environment
// {
// public:
//     virtual void SetUp() override
//     {
//         std::cout << "测试前:提前准备数据!!\n";
//         dict.insert(std::make_pair("Hello", "你好"));
//         dict.insert(std::make_pair("hello", "你好"));
//         dict.insert(std::make_pair("雷吼", "你好"));
//     }
//     virtual void TearDown() override
//     {
//         std::cout << "测试结束后:清理数据!!\n";
//         dict.clear();
//     }
// };
// TEST(hash_case_test, find_test)
// {
//     auto it = dict.find("hello");
//     ASSERT_NE(it, dict.end());
// }
// TEST(hash_case_test, size_test)
// {
//     ASSERT_GT(dict.size(), 0);
// }
// int main(int argc, char *argv[])
// {
//     testing::AddGlobalTestEnvironment(new HashTestEnv);
//     testing::InitGoogleTest(&argc, argv);
//     return RUN_ALL_TESTS();
// }

#include <iostream>
#include <gtest/gtest.h>
// TestSuite:测试套件/集合进行单元测试,即,将多个相关测试归入一组的方式进
// 行测试,为这组测试用例进行环境配置和清理
// 概念: 对一个功能的验证往往需要很多测试用例，测试套件就是针对一组相关测
// 试用例进行环境配置的事件机制
// 用法: 先定义环境类,继承于 testing::Test 基类, 重写两个静态函数
//SetUpTestCase  TearDownTestCase 进行环境的配置和清理 
class HashTestEnv1 : public testing::Test
{
public:
    static void SetUpTestCase()
    {
        std::cout << "环境 1 第一个 TEST 之前调用\n";
    }
    static void TearDownTestCase()
    {
        std::cout << "环境 1 最后一个 TEST 之后调用\n";
    }

public:
    std::unordered_map<std::string, std::string> dict;
};
// 注意,测试套件使用的不是 TEST 了,而是 TEST_F, 而第一个参数名称就是测试
// 套件环境类名称
// main 函数中不需要再注册环境了,而是在 TEST_F 中可以直接访问类的成员变量和成员函数
TEST_F(HashTestEnv1, insert_test)
{
    std::cout << " 环境 1,中间 insert 测试\n";
    dict.insert(std::make_pair("Hello", "你好"));
    dict.insert(std::make_pair("hello", "你好"));
    dict.insert(std::make_pair("雷吼", "你好"));
    auto it = dict.find("hello");
    ASSERT_NE(it, dict.end());
}
TEST_F(HashTestEnv1, sizeof)
{
    std::cout << "环境 1,中间 size 测试\n";
    ASSERT_GT(dict.size(), 0);
}

int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    
    return RUN_ALL_TESTS();
}